// RUN: llvm-objdump -p %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s
// RUN: llvm-otool -lv %p/Inputs/hello.obj.macho-x86_64 | FileCheck %s
// RUN: llvm-objdump -p %p/Inputs/hello.exe.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=EXE
// RUN: llvm-objdump -p %p/Inputs/dylibLoadKinds.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=LOAD
// RUN: llvm-objdump -p %p/Inputs/linkerOption.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=LD_OPT
// RUN: llvm-objdump -p %p/Inputs/dylibSubFramework.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=SUB_FRAME
// RUN: llvm-objdump -p %p/Inputs/dylibSubUmbrella.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=SUB_UMB
// RUN: llvm-objdump -p %p/Inputs/dylibSubLibrary.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=SUB_LIB
// RUN: llvm-objdump -p %p/Inputs/dylibSubClient.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=SUB_CLI
// RUN: llvm-objdump -p %p/Inputs/dylibRoutines.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=ROUTINE
// RUN: llvm-objdump -p %p/Inputs/exeThread.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=THREAD
// RUN: llvm-objdump --macho -p --arch i386 %p/Inputs/macho-universal.x86_64.i386 \
// RUN:     | FileCheck %s -check-prefix=FATi386
// RUN: llvm-objdump -p --arch i386 %p/Inputs/macho-universal.x86_64.i386 \
// RUN:     | FileCheck %s -check-prefix=FATi386
// RUN: llvm-objdump -p --non-verbose %p/Inputs/hello.obj.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=NON_VERBOSE
// RUN: llvm-objdump -p %p/Inputs/codesig.macho-x86_64 \
// RUN:     | FileCheck %s -check-prefix=CODESIG
// RUN: llvm-objdump -p %p/Inputs/note.macho-x86 \
// RUN:     | FileCheck %s -check-prefix=NOTE

CHECK: Mach header
CHECK:       magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
CHECK: MH_MAGIC_64  X86_64        ALL  0x00      OBJECT     3        496 SUBSECTIONS_VIA_SYMBOLS
CHECK: Load command 0
CHECK:       cmd LC_SEGMENT_64
CHECK:   cmdsize 392
CHECK:   segname 
CHECK:    vmaddr 0x0000000000000000
CHECK:    vmsize 0x00000000000000a8
CHECK:   fileoff 528
CHECK:  filesize 168
CHECK:   maxprot rwx
CHECK:  initprot rwx
CHECK:    nsects 4
CHECK:     flags (none)
CHECK: Section
CHECK:   sectname __text
CHECK:    segname __TEXT
CHECK:       addr 0x0000000000000000
CHECK:       size 0x000000000000003b
CHECK:     offset 528
CHECK:      align 2^4 (16)
CHECK:     reloff 696
CHECK:     nreloc 2
CHECK:       type S_REGULAR
CHECK: attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS
CHECK:  reserved1 0
CHECK:  reserved2 0
CHECK: Section
CHECK:   sectname __cstring
CHECK:    segname __TEXT
CHECK:       addr 0x000000000000003b
CHECK:       size 0x000000000000000d
CHECK:     offset 587
CHECK:      align 2^0 (1)
CHECK:     reloff 0
CHECK:     nreloc 0
CHECK:       type S_CSTRING_LITERALS
CHECK: attributes (none)
CHECK:  reserved1 0
CHECK:  reserved2 0
CHECK: Section
CHECK:   sectname __compact_unwind
CHECK:    segname __LD
CHECK:       addr 0x0000000000000048
CHECK:       size 0x0000000000000020
CHECK:     offset 600
CHECK:      align 2^3 (8)
CHECK:     reloff 712
CHECK:     nreloc 1
CHECK:       type S_REGULAR
CHECK: attributes DEBUG
CHECK:  reserved1 0
CHECK:  reserved2 0
CHECK: Section
CHECK:   sectname __eh_frame
CHECK:    segname __TEXT
CHECK:       addr 0x0000000000000068
CHECK:       size 0x0000000000000040
CHECK:     offset 632
CHECK:      align 2^3 (8)
CHECK:     reloff 0
CHECK:     nreloc 0
CHECK:       type S_COALESCED
CHECK: attributes NO_TOC STRIP_STATIC_SYMS LIVE_SUPPORT
CHECK:  reserved1 0
CHECK:  reserved2 0
CHECK: Load command 1
CHECK:      cmd LC_SYMTAB
CHECK:  cmdsize 24
CHECK:   symoff 720
CHECK:    nsyms 5
CHECK:   stroff 800
CHECK:  strsize 44
CHECK: Load command 2
CHECK:             cmd LC_DYSYMTAB
CHECK:         cmdsize 80
CHECK:       ilocalsym 0
CHECK:       nlocalsym 2
CHECK:      iextdefsym 2
CHECK:      nextdefsym 2
CHECK:       iundefsym 4
CHECK:       nundefsym 1
CHECK:          tocoff 0
CHECK:            ntoc 0
CHECK:       modtaboff 0
CHECK:         nmodtab 0
CHECK:    extrefsymoff 0
CHECK:     nextrefsyms 0
CHECK:  indirectsymoff 0
CHECK:   nindirectsyms 0
CHECK:       extreloff 0
CHECK:         nextrel 0
CHECK:       locreloff 0
CHECK:         nlocrel 0

EXE: Mach header
EXE:       magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
EXE: MH_MAGIC_64  X86_64        ALL LIB64     EXECUTE    16       1296   NOUNDEFS DYLDLINK TWOLEVEL PIE
EXE: Load command 0
EXE:       cmd LC_SEGMENT_64
EXE:   cmdsize 72
EXE:   segname __PAGEZERO
EXE:    vmaddr 0x0000000000000000
EXE:    vmsize 0x0000000100000000
EXE:   fileoff 0
EXE:  filesize 0
EXE:   maxprot ---
EXE:  initprot ---
EXE:    nsects 0
EXE:     flags (none)
EXE: Load command 1
EXE:       cmd LC_SEGMENT_64
EXE:   cmdsize 552
EXE:   segname __TEXT
EXE:    vmaddr 0x0000000100000000
EXE:    vmsize 0x0000000000001000
EXE:   fileoff 0
EXE:  filesize 4096
EXE:   maxprot rwx
EXE:  initprot r-x
EXE:    nsects 6
EXE:     flags (none)
EXE: Section
EXE:   sectname __text
EXE:    segname __TEXT
EXE:       addr 0x0000000100000f30
EXE:       size 0x000000000000003b
EXE:     offset 3888
EXE:      align 2^4 (16)
EXE:     reloff 0
EXE:     nreloc 0
EXE:       type S_REGULAR
EXE: attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS
EXE:  reserved1 0
EXE:  reserved2 0
EXE: Section
EXE:   sectname __stubs
EXE:    segname __TEXT
EXE:       addr 0x0000000100000f6c
EXE:       size 0x0000000000000006
EXE:     offset 3948
EXE:      align 2^1 (2)
EXE:     reloff 0
EXE:     nreloc 0
EXE:       type S_SYMBOL_STUBS
EXE: attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS
EXE:  reserved1 0 (index into indirect symbol table)
EXE:  reserved2 6 (size of stubs)
EXE: Section
EXE:   sectname __stub_helper
EXE:    segname __TEXT
EXE:       addr 0x0000000100000f74
EXE:       size 0x000000000000001a
EXE:     offset 3956
EXE:      align 2^2 (4)
EXE:     reloff 0
EXE:     nreloc 0
EXE:       type S_REGULAR
EXE: attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS
EXE:  reserved1 0
EXE:  reserved2 0
EXE: Section
EXE:   sectname __cstring
EXE:    segname __TEXT
EXE:       addr 0x0000000100000f8e
EXE:       size 0x000000000000000d
EXE:     offset 3982
EXE:      align 2^0 (1)
EXE:     reloff 0
EXE:     nreloc 0
EXE:       type S_CSTRING_LITERALS
EXE: attributes (none)
EXE:  reserved1 0
EXE:  reserved2 0
EXE: Section
EXE:   sectname __unwind_info
EXE:    segname __TEXT
EXE:       addr 0x0000000100000f9b
EXE:       size 0x0000000000000048
EXE:     offset 3995
EXE:      align 2^0 (1)
EXE:     reloff 0
EXE:     nreloc 0
EXE:       type S_REGULAR
EXE: attributes (none)
EXE:  reserved1 0
EXE:  reserved2 0
EXE: Section
EXE:   sectname __eh_frame
EXE:    segname __TEXT
EXE:       addr 0x0000000100000fe8
EXE:       size 0x0000000000000018
EXE:     offset 4072
EXE:      align 2^3 (8)
EXE:     reloff 0
EXE:     nreloc 0
EXE:       type S_REGULAR
EXE: attributes (none)
EXE:  reserved1 0
EXE:  reserved2 0
EXE: Load command 2
EXE:       cmd LC_SEGMENT_64
EXE:   cmdsize 232
EXE:   segname __DATA
EXE:    vmaddr 0x0000000100001000
EXE:    vmsize 0x0000000000001000
EXE:   fileoff 4096
EXE:  filesize 4096
EXE:   maxprot rwx
EXE:  initprot rw-
EXE:    nsects 2
EXE:     flags (none)
EXE: Section
EXE:   sectname __nl_symbol_ptr
EXE:    segname __DATA
EXE:       addr 0x0000000100001000
EXE:       size 0x0000000000000010
EXE:     offset 4096
EXE:      align 2^3 (8)
EXE:     reloff 0
EXE:     nreloc 0
EXE:       type S_NON_LAZY_SYMBOL_POINTERS
EXE: attributes (none)
EXE:  reserved1 1 (index into indirect symbol table)
EXE:  reserved2 0
EXE: Section
EXE:   sectname __la_symbol_ptr
EXE:    segname __DATA
EXE:       addr 0x0000000100001010
EXE:       size 0x0000000000000008
EXE:     offset 4112
EXE:      align 2^3 (8)
EXE:     reloff 0
EXE:     nreloc 0
EXE:       type S_LAZY_SYMBOL_POINTERS
EXE: attributes (none)
EXE:  reserved1 3 (index into indirect symbol table)
EXE:  reserved2 0
EXE: Load command 3
EXE:       cmd LC_SEGMENT_64
EXE:   cmdsize 72
EXE:   segname __LINKEDIT
EXE:    vmaddr 0x0000000100002000
EXE:    vmsize 0x0000000000001000
EXE:   fileoff 8192
EXE:  filesize 304
EXE:   maxprot rwx
EXE:  initprot r--
EXE:    nsects 0
EXE:     flags (none)
EXE: Load command 4
EXE:             cmd LC_DYLD_INFO_ONLY
EXE:         cmdsize 48
EXE:      rebase_off 8192
EXE:     rebase_size 8
EXE:        bind_off 8200
EXE:       bind_size 24
EXE:   weak_bind_off 0
EXE:  weak_bind_size 0
EXE:   lazy_bind_off 8224
EXE:  lazy_bind_size 16
EXE:      export_off 8240
EXE:     export_size 48
EXE: Load command 5
EXE:      cmd LC_SYMTAB
EXE:  cmdsize 24
EXE:   symoff 8360
EXE:    nsyms 4
EXE:   stroff 8440
EXE:  strsize 56
EXE: Load command 6
EXE:             cmd LC_DYSYMTAB
EXE:         cmdsize 80
EXE:       ilocalsym 0
EXE:       nlocalsym 0
EXE:      iextdefsym 0
EXE:      nextdefsym 2
EXE:       iundefsym 2
EXE:       nundefsym 2
EXE:          tocoff 0
EXE:            ntoc 0
EXE:       modtaboff 0
EXE:         nmodtab 0
EXE:    extrefsymoff 0
EXE:     nextrefsyms 0
EXE:  indirectsymoff 8424
EXE:   nindirectsyms 4
EXE:       extreloff 0
EXE:         nextrel 0
EXE:       locreloff 0
EXE:         nlocrel 0
EXE: Load command 7
EXE:           cmd LC_LOAD_DYLINKER
EXE:       cmdsize 32
EXE:          name /usr/lib/dyld (offset 12)
EXE: Load command 8
EXE:      cmd LC_UUID
EXE:  cmdsize 24
EXE:     uuid 65C2DD41-79B0-3B34-871B-8CB3446AB762
EXE: Load command 9
EXE:       cmd LC_VERSION_MIN_MACOSX
EXE:   cmdsize 16
EXE:   version 10.9
EXE:       sdk 10.9
EXE: Load command 10
EXE:       cmd LC_SOURCE_VERSION
EXE:   cmdsize 16
EXE:   version 0.0
EXE: Load command 11
EXE:        cmd LC_MAIN
EXE:    cmdsize 24
EXE:   entryoff 3888
EXE:  stacksize 0
EXE: Load command 12
EXE:           cmd LC_LOAD_DYLIB
EXE:       cmdsize 56
EXE:          name /usr/lib/libSystem.B.dylib (offset 24)
EXE:       current version 1197.1.1
EXE: compatibility version 1.0.0
EXE: Load command 13
EXE:       cmd LC_FUNCTION_STARTS
EXE:   cmdsize 16
EXE:   dataoff 8288
EXE:  datasize 8
EXE: Load command 14
EXE:       cmd LC_DATA_IN_CODE
EXE:   cmdsize 16
EXE:   dataoff 8296
EXE:  datasize 0
EXE: Load command 15
EXE:       cmd LC_DYLIB_CODE_SIGN_DRS
EXE:   cmdsize 16
EXE:   dataoff 8296
EXE:  datasize 64


LOAD: Load command 10
LOAD:           cmd LC_LOAD_DYLIB
LOAD:       cmdsize 48
LOAD:          name /usr/lib/foo1.dylib (offset 24)
LOAD:       current version 0.0.0
LOAD: compatibility version 0.0.0
LOAD: Load command 11
LOAD:           cmd LC_LOAD_WEAK_DYLIB
LOAD:       cmdsize 48
LOAD:          name /usr/lib/foo2.dylib (offset 24)
LOAD:       current version 0.0.0
LOAD: compatibility version 0.0.0
LOAD: Load command 12
LOAD:           cmd LC_REEXPORT_DYLIB
LOAD:       cmdsize 48
LOAD:          name /usr/lib/foo3.dylib (offset 24)
LOAD:       current version 0.0.0
LOAD: compatibility version 0.0.0
LOAD: Load command 13
LOAD:           cmd LC_LAZY_LOAD_DYLIB
LOAD:       cmdsize 48
LOAD:          name /usr/lib/foo4.dylib (offset 24)
LOAD:       current version 0.0.0
LOAD: compatibility version 0.0.0

LD_OPT: Load command 4
LD_OPT:      cmd LC_LINKER_OPTION
LD_OPT:  cmdsize 24
LD_OPT:    count 1
LD_OPT:   string #1 -lc++
LD_OPT: Load command 5
LD_OPT:      cmd LC_LINKER_OPTION
LD_OPT:  cmdsize 40
LD_OPT:    count 2
LD_OPT:   string #1 -framework
LD_OPT:   string #2 Foundation

SUB_FRAME: Load command 10
SUB_FRAME:           cmd LC_SUB_FRAMEWORK
SUB_FRAME:       cmdsize 16
SUB_FRAME:      umbrella Bar (offset 12)

SUB_UMB: Load command 5
SUB_UMB:           cmd LC_SUB_UMBRELLA
SUB_UMB:       cmdsize 16
SUB_UMB:  sub_umbrella Foo (offset 12)

SUB_LIB: Load command 5
SUB_LIB:           cmd LC_SUB_LIBRARY
SUB_LIB:       cmdsize 20
SUB_LIB:   sub_library libfoo (offset 12)

SUB_CLI: Load command 10
SUB_CLI:           cmd LC_SUB_CLIENT
SUB_CLI:       cmdsize 16
SUB_CLI:        client bar (offset 12)

ROUTINE: Load command 6
ROUTINE:           cmd LC_ROUTINES_64
ROUTINE:       cmdsize 72
ROUTINE:  init_address 0x0000000000000f80
ROUTINE:   init_module 0
ROUTINE:     reserved1 0
ROUTINE:     reserved2 0
ROUTINE:     reserved3 0
ROUTINE:     reserved4 0
ROUTINE:     reserved5 0
ROUTINE:     reserved6 0

THREAD: Load command 10
THREAD:         cmd LC_UNIXTHREAD
THREAD:     cmdsize 184
THREAD:      flavor x86_THREAD_STATE64
THREAD:       count x86_THREAD_STATE64_COUNT
THREAD:    rax  0x0000000000000000 rbx 0x0000000000000000 rcx  0x0000000000000000
THREAD:    rdx  0x0000000000000000 rdi 0x0000000000000000 rsi  0x0000000000000000
THREAD:    rbp  0x0000000000000000 rsp 0x0000000000000000 r8   0x0000000000000000
THREAD:     r9  0x0000000000000000 r10 0x0000000000000000 r11  0x0000000000000000
THREAD:    r12  0x0000000000000000 r13 0x0000000000000000 r14  0x0000000000000000
THREAD:    r15  0x0000000000000000 rip 0x0000000100000d00
THREAD: rflags  0x0000000000000000 cs  0x0000000000000000 fs   0x0000000000000000
THREAD:     gs  0x0000000000000000

FATi386: Mach header
FATi386:       magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
FATi386:    MH_MAGIC    I386        ALL  0x00     EXECUTE    16        716   NOUNDEFS DYLDLINK TWOLEVEL PIE MH_NO_HEAP_EXECUTION

NON_VERBOSE: Mach header
NON_VERBOSE:       magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
NON_VERBOSE:  0xfeedfacf 16777223          3  0x00           1     3        496 0x00002000
NON_VERBOSE: Load command 0
NON_VERBOSE:       cmd LC_SEGMENT_64
NON_VERBOSE:   cmdsize 392
NON_VERBOSE:   segname 
NON_VERBOSE:    vmaddr 0x0000000000000000
NON_VERBOSE:    vmsize 0x00000000000000a8
NON_VERBOSE:   fileoff 528
NON_VERBOSE:  filesize 168
NON_VERBOSE:   maxprot 0x00000007
NON_VERBOSE:  initprot 0x00000007
NON_VERBOSE:    nsects 4
NON_VERBOSE:     flags 0x0
NON_VERBOSE: Section
NON_VERBOSE:   sectname __text
NON_VERBOSE:    segname __TEXT
NON_VERBOSE:       addr 0x0000000000000000
NON_VERBOSE:       size 0x000000000000003b
NON_VERBOSE:     offset 528
NON_VERBOSE:      align 2^4 (16)
NON_VERBOSE:     reloff 696
NON_VERBOSE:     nreloc 2
NON_VERBOSE:      flags 0x80000400
NON_VERBOSE:  reserved1 0
NON_VERBOSE:  reserved2 0
NON_VERBOSE: Section
NON_VERBOSE:   sectname __cstring
NON_VERBOSE:    segname __TEXT
NON_VERBOSE:       addr 0x000000000000003b
NON_VERBOSE:       size 0x000000000000000d
NON_VERBOSE:     offset 587
NON_VERBOSE:      align 2^0 (1)
NON_VERBOSE:     reloff 0
NON_VERBOSE:     nreloc 0
NON_VERBOSE:      flags 0x00000002
NON_VERBOSE:  reserved1 0
NON_VERBOSE:  reserved2 0
NON_VERBOSE: Section
NON_VERBOSE:   sectname __compact_unwind
NON_VERBOSE:    segname __LD
NON_VERBOSE:       addr 0x0000000000000048
NON_VERBOSE:       size 0x0000000000000020
NON_VERBOSE:     offset 600
NON_VERBOSE:      align 2^3 (8)
NON_VERBOSE:     reloff 712
NON_VERBOSE:     nreloc 1
NON_VERBOSE:      flags 0x02000000
NON_VERBOSE:  reserved1 0
NON_VERBOSE:  reserved2 0
NON_VERBOSE: Section
NON_VERBOSE:   sectname __eh_frame
NON_VERBOSE:    segname __TEXT
NON_VERBOSE:       addr 0x0000000000000068
NON_VERBOSE:       size 0x0000000000000040
NON_VERBOSE:     offset 632
NON_VERBOSE:      align 2^3 (8)
NON_VERBOSE:     reloff 0
NON_VERBOSE:     nreloc 0
NON_VERBOSE:      flags 0x6800000b
NON_VERBOSE:  reserved1 0
NON_VERBOSE:  reserved2 0
NON_VERBOSE: Load command 1
NON_VERBOSE:      cmd LC_SYMTAB
NON_VERBOSE:  cmdsize 24
NON_VERBOSE:   symoff 720
NON_VERBOSE:    nsyms 5
NON_VERBOSE:   stroff 800
NON_VERBOSE:  strsize 44
NON_VERBOSE: Load command 2
NON_VERBOSE:             cmd LC_DYSYMTAB
NON_VERBOSE:         cmdsize 80
NON_VERBOSE:       ilocalsym 0
NON_VERBOSE:       nlocalsym 2
NON_VERBOSE:      iextdefsym 2
NON_VERBOSE:      nextdefsym 2
NON_VERBOSE:       iundefsym 4
NON_VERBOSE:       nundefsym 1
NON_VERBOSE:          tocoff 0
NON_VERBOSE:            ntoc 0
NON_VERBOSE:       modtaboff 0
NON_VERBOSE:         nmodtab 0
NON_VERBOSE:    extrefsymoff 0
NON_VERBOSE:     nextrefsyms 0
NON_VERBOSE:  indirectsymoff 0
NON_VERBOSE:   nindirectsyms 0
NON_VERBOSE:       extreloff 0
NON_VERBOSE:         nextrel 0
NON_VERBOSE:       locreloff 0
NON_VERBOSE:         nlocrel 0

CODESIG:      cmd LC_CODE_SIGNATURE
CODESIG:  cmdsize 16
CODESIG:  dataoff 8496
CODESIG: datasize 64

NOTE:        cmd LC_NOTE
NOTE:    cmdsize 40
NOTE: data_owner DATA OWNER
NOTE:     offset 68
NOTE:       size 8
